iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
DevOps

第一次參賽就學 Kubernetes系列 第 13

[Day 13] Ingress

  • 分享至 

  • xImage
  •  

Ingress

Ingress 是用來管理叢集外部訪問叢集內部 service 的元件。提供外部使用者透過 domain(網址) 來存取內部資源,具有路由的功能,可設定路徑規則將請求轉發至指定的 services。

Ingress 除了提供應用程式負載平衡的功能外,也可以設定 SSL 連線,以及將多個網站或 domain 架在同一個 IP 上的功能(基於網域名稱的虛擬主機,name-based virtual hosting)。

建立 Ingress

  1. 安裝 Ingress 控制器
  2. 建立與設定 Ingress 資源

因 k8s 沒有實作 Ingress,要另外下載第三方的 Ingress controller,常見的有 Nginx Ingress Controller(k8s 官方維護的)、Traefik Ingress Controller 與 Istio Ingress:Istio。

這邊使用 minikube 並安裝 Nginx Ingress Controller 為範例,如何在叢集中建立 Ingress。

  1. 在 minikube 中啟用 ingress
minikube addons enable ingress
  1. 查看 Ingress 是否有啟動
kubectl get pods -n ingress-nginx

NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-rqsg4        0/1     Completed   0          3m25s
ingress-nginx-admission-patch-rwwkr         0/1     Completed   1          3m25s
ingress-nginx-controller-7799c6795f-2x69n   1/1     Running     0          3m25s
  1. 建立 hello world 程式
kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0

deployment.apps/web created

建立一個 service,類型為 NodePort、port 為 8080。

kubectl expose deployment web --port=8080 --type=NodePort

service/web exposed

查看 service。

kubectl get svc web

NAME   TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
web    NodePort   10.97.40.77   <none>        8080:31721/TCP   74s

測試看看是否可以使用 Minikube IP 位址和 NodePort 來存取這個 hello world 程式。

minikube service web --url

http://127.0.0.1:50068
❗  Because you are using a Docker driver on darwin, the terminal needs to be open to run it.

點開 url 可以成功看到 hello world 程式。

https://ithelp.ithome.com.tw/upload/images/20230928/20162511NxV0JgVsEw.png

  1. 建立 Ingress 資源

準備一個設定檔 hello-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: hello-ingress
spec:
  rules:
  - host: hello-world.info
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web
            port:
              number: 8080

以下解說 spec

  • rules:設定 Ingress 的路由規則
  • host:將來自 hello-world.info 的請求轉發至以下指定的 service
  • pathhost 的路徑配對,這邊指對應到 hello-world.info/ 所有路徑

建立 Ingress。

kubectl apply -f hello-ingress.yaml

ingress.networking.k8s.io/hello-ingress created

查看剛才建立的 Ingress,可以看到 ADDRESS 為 192.168.49.2。

kubectl get ingress

NAME            CLASS   HOSTS              ADDRESS        PORTS   AGE
hello-ingress   nginx   hello-world.info   192.168.49.2   80      7m15s
  1. 修改 hosts 設定檔

設定一下 /etc/hosts 將 hello-world.info 對應至該 IP 位址,這邊修改會需要管理者權限。

sudo vim /etc/hosts

這邊若是按照官方文件加入 ingress IP 192.168.49.2 hello-world.info,會連不到 hello-world.info,後來在這邊 stack overflow 看到要加入 127.0.0.1 hello-world.info,再另外執行以下指令。

minikube tunnel
✅  Tunnel successfully started

📌  NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ...

❗  The service/ingress hello-ingress requires privileged ports to be exposed: [80 443]
🔑  sudo permission will be asked for it.
🏃  Starting tunnel for service hello-ingress.

最後前往 http://hello-world.info。 看到以下畫面。

https://ithelp.ithome.com.tw/upload/images/20230928/201625110fuWVTKqIr.png

Ingress default backend

當請求沒有對應到 Ingress 上的規則時,則會將流量轉發至 Default backend

kubectl describe ingress hello-ingress

Name:             hello-ingress
Labels:           <none>
Namespace:        default
Address:          192.168.49.2
Ingress Class:    nginx
Default backend:  <default>
Rules:
  Host              Path  Backends
  ----              ----  --------
  hello-world.info
                    /   web:8080 (10.244.0.100:8080)
Annotations:        <none>
Events:
  Type    Reason  Age                From                      Message
  ----    ------  ----               ----                      -------
  Normal  Sync    27m (x2 over 27m)  nginx-ingress-controller  Scheduled for sync

參考來源

  1. Set up Ingress on Minikube with the NGINX Ingress Controller

上一篇
[Day 12] Service
下一篇
[Day 14] ConfigMap
系列文
第一次參賽就學 Kubernetes30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言